import sys
import pygame
from time import sleep

from bullet import Bullet
from alien  import Alien


def check_events(ai_settings,screen,ship,bullets,stats,play_button,
	aliens,sb):
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			sys.exit()
		elif event.type == pygame.MOUSEBUTTONDOWN:
			mouse_x,mouse_y = pygame.mouse.get_pos()
			check_play_button(stats,play_button,mouse_x,mouse_y,
				ai_settings,screen,aliens,ship,bullets,sb)
		elif event.type == pygame.KEYDOWN:	
			check_keydown_enent(event,ai_settings,screen,ship,bullets)
		elif event.type == pygame.KEYUP:
			check_keyup_enent(event,ship)


def update_screen(ai_settings,screen,ship,bullets,aliens,play_button
	,stats,sb):
	screen.fill(ai_settings.bg_color)
	ship.blitme()
	aliens.draw(screen)
	for bullet in bullets.sprites():
		bullet.draw_bullet()
	sb.show_score()
	if not stats.game_active:
		play_button.draw_button()
	pygame.display.flip()


def check_keydown_enent(event,ai_settings,screen,ship,bullets):
	if event.key == pygame.K_RIGHT:
		ship.move_right = True
	elif event.key == pygame.K_LEFT:
		ship.move_left = True
	elif event.key == pygame.K_SPACE:
		fire_bullet(ai_settings,screen,ship,bullets)
	elif event.key == pygame.K_q:
		sys.exit()

def check_keyup_enent(event,ship):
	if event.key == pygame.K_RIGHT:
		ship.move_right = False
	elif event.key == pygame.K_LEFT:
		ship.move_left = False

def check_play_button(stats,play_button,mouse_x,mouse_y,
	ai_settings,screen,aliens,ship,bullets,sb):
	buttom_clicked = play_button.rect.collidepoint(mouse_x,mouse_y)
	if buttom_clicked and not stats.game_active:
		ai_settings.initialize_dynamic_settings()
		pygame.mouse.set_visible(False)	
		stats.game_active = True
		stats.reset_stats()
		sb.prep_score()
		sb.prep_level()
		sb.prep_high_score()
		sb.prep_ships()
		aliens.empty()
		bullets.empty()
		create_fleet(ai_settings,screen,aliens,ship)
		ship.center_ship()

def update_bullets(ai_settings,ship,screen,bullets,aliens,stats,sb):
	bullets.update()
	for bullet in bullets.copy():
		if bullet.rect.bottom <= 0:
			bullets.remove(bullet)
	check_bullet_alien_collisions(ai_settings,ship,
		screen,bullets,aliens,stats,sb)

def check_bullet_alien_collisions(ai_settings,ship,
	screen,bullets,aliens,stats,sb):
	collisions = pygame.sprite.groupcollide(bullets,aliens,True,True)
	if collisions:
		for aliens in collisions.values():
			stats.score += ai_settings.alien_points*len(aliens)
		sb.prep_score()
		check_high_score(stats,sb)

	if len(aliens) ==0:
		bullets.empty()
		ai_settings.increase_speed()
		stats.level += 1
		sb.prep_level()
		create_fleet(ai_settings,screen,aliens,ship)


def fire_bullet(ai_settings,screen,ship,bullets):
	if len(bullets) < ai_settings.bullet_allowed:
			new_bullet = Bullet(ai_settings,screen,ship)
			bullets.add(new_bullet)

def create_fleet(ai_settings,screen,aliens,ship):
	alien = Alien(ai_settings,screen)
	number_aliens_x = get_number_aliens_x(ai_settings,alien.rect.width)
	number_rows = get_number_rows(ai_settings,ship.rect.height,
		alien.rect.height)
	for row_number in range(number_rows):		
		for alien_number in range(number_aliens_x):
			create_alien(ai_settings,screen,aliens,alien_number,
				row_number)
		

def get_number_aliens_x(ai_settings, alien_width):
	available_space_x = ai_settings.screen_width -2*alien_width
	number_aliens_x = int(available_space_x/(2*alien_width))

	return number_aliens_x

def create_alien(ai_settings,screen,aliens,alien_number,row_number):
	alien = Alien(ai_settings,screen)
	alien_width = alien.rect.width
	alien.x = alien_width+2*alien_width*alien_number
	alien.rect.x = alien.x
	alien.rect.y = alien.rect.height +2*alien.rect.height*row_number
	aliens.add(alien)

def get_number_rows(ai_settings,ship_height,alien_height):
	available_space_y = (ai_settings.screen_height-3*alien_height
		-ship_height)
	number_rows = int(available_space_y/(2*alien_height))
	return number_rows

def update_aliens(ai_settings,aliens,ship,stats,screen,bullets,sb):
	check_fleet_edges(ai_settings,aliens)
	aliens.update()
	if pygame.sprite.spritecollideany(ship,aliens):
		ship_hit(ai_settings,stats,screen,ship,aliens,bullets,sb)
	check_aliens_bottom(ai_settings,stats,screen,ship,aliens,
		bullets,sb)

def check_fleet_edges(ai_settings,aliens):
	for alien in aliens:
		#print(len(aliens))
		if alien.check_edges():
			change_fleet_direction(ai_settings,aliens)
			break

def change_fleet_direction(ai_settings,aliens):
	for alien in aliens.sprites():
		alien.rect.y += ai_settings.fleet_drop_speed
	ai_settings.fleet_drection *= -1

def ship_hit(ai_settings,stats,screen,ship,aliens,bullets,sb):
	if stats.ships_left > 0:
		stats.ships_left -= 1
		sleep(1)
		aliens.empty()
		bullets.empty()
		create_fleet(ai_settings,screen,aliens,ship)
		ship.center_ship()
		sb.prep_ships()
	else:
		stats.game_active = False
		pygame.mouse.set_visible(True)
	
	
	
def check_aliens_bottom(ai_settings,stats,screen,ship,aliens,
	bullets,sb):
	screen_rect = screen.get_rect()
	for alien in aliens.sprites():
		if alien.rect.bottom>=screen_rect.bottom:
			ship_hit(ai_settings,stats,screen,ship,aliens,bullets,sb)
			break

def check_high_score(stats,sb):
	if stats.score > stats.high_score:
		stats.high_score = stats.score
		sb.prep_high_score()






